<?php

namespace core;

if(!defined('ACCESS')) DIE('非法的操作！');//检查令牌
class App{

    private static $_obj_arr=array();

    //单例工厂
    public static function single($className, $params=NULL){ 
        
        if( !isset(self::$_obj_arr[$className]) ){
            self::$_obj_arr[$className] =new $className($params);
        }
        return self::$_obj_arr[$className];
    }

    

    //自动加载
    public static function auto_load($className){ 


        //\core\NewsModel
        $className = basename($className);
        //NewsModel
        if( substr($className, -5)=='Model' ){//引入MODEL类文件  substr($className, -5) ==> substr('NewsModel', -5) ==> Model

            include APP_MODEL_PATH . $className . '.class.php';
        }elseif( substr($className, -10)=='Controller' ) {//引入CONTROLLER类文件  substr($className, -10) ==> substr('NewsController', -10) ==> Controller

            include APP_PATH . $GLOBALS['plat'] . '/controller/' . $className . '.class.php';
        }elseif( substr($className, -4)=='Tool' ) {//引入工具类

            // mvc/plugins              CaptchaTool     .class.php
            include PLUGINS_PATH . $className . '.class.php';
        }
    }

    //启动方法
    public static function run(){ 

        $GLOBALS['plat'] = $plat = empty($_GET['p']) ? C('access.p') : $_GET['p'];//通过plat参数来接收平台名，这个参数在MVC中，我们称为：平台参数
        $GLOBALS['module']=$module = empty($_GET['m']) ? C('access.m') : $_GET['m'];//通过module参数来接受控制器类名，这个参数在MVC中，我们称为：模块
        $action = empty($_GET['a']) ? C('access.a') : $_GET['a'];//通过action参数来接收控制器方法的方法名，这个参数在MVC中，我们称为：动作

        $className = '\\'.$plat.'\\controller\\'.$module.'Controller';//构建控制器类名
        $obj = SF($className);//实例化控制器类的对象
        $obj->$action();//调用控制器下的方法
    }
}